'use strict';
/**
 * author：小小游 --- allen
 * date：2018.02.06
 * lastUpdateDate：2018.02.06
 * description：DataView视图的基本用法
 */
/**
 * DataView的两个好处，如下：
 * 1.可以处理网络的高低位的这种数据，也就是说很多网络设备传导过来的很多都是
 * 以高位这种字节序，所以说需要对它的这种读写进行特殊方法的处理。比如说我们
 * 熟悉的物联网很多设备可能嵌入Javascript虚拟机，那么我们如何对这个二进制
 * 数据进行处理、写入、读取是非常重要的。而这个网络设备，它的字节顺序基本上
 * 都是高位的，就比如我们的OS(Operation System)绝大多数都是用小端的字节
 * 序，而网络这些大端字节序和小端字节序读取的时候刚好相反，所以说这种数据格
 * 式(数据模式)能正好就可以通过DataView来进行读取和写入。
 * 2.如果buffer这个数据里存储的不完全是同一种格式，比如说，它里面存储的都
 * 是Int8Array，那么我们直接就创建一个Int8Array的类型化数组对象进行操作
 * 就行了。但是有时候可能它里面存储的不完全只有一种类型，比如说，一个png图
 * 片格式，它里面就单单头文件就可能需要Float32Array、Int32Array等等，这
 * 时候要实现需求的话就要创建很多个不同类型化数组的对象进行写入和读取，非常
 * 的麻烦。那么此时如果通过DataView，只创建一个进行处理就行了，挺好！
 */
/**
 * DataView视图的基本用法，如下例子所示：
 */
// 先创建一个类型化数组
let buf = new ArrayBuffer(12);
// let dataView = new dataView(buf, start, end);不写end就直接默认到end
let dataView = new DataView(buf);

// let buf = new Int8Array(12);
// [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]

/**
 * 第一个参数表示跳过几个开始设置值，第二个参数是具体
 * 要设置的值，第三个参数默认不设置就是false，表示大端
 * 读取字节序，我们将其设置成小端读取字节序true
 */
dataView.setFloat32(2, 4000000000.111111, true);
dataView.setInt32(6, 20000000, true);
dataView.setInt16(0, 9999, true);

// 读取DataView的值，第二个值也设置为true，让其为小端读取字节序
console.log(dataView.getFloat32(2,true));
console.log(dataView.getInt32(6,true));
console.log(dataView.getInt16(0,true));

// test
let testBuf = new Int8Array(buf);
// result：12 12
console.log(testBuf.length, testBuf.byteLength);
